package com.imm.persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Date;





import com.imm.persistencia.Constants;
import com.imm.persistencia.DBConn;
import com.imm.dominio.Agencia;
import com.imm.dominio.Anulado;
import com.imm.dominio.Usuario;
import com.imm.dominio.Venta;

public class PersistenciaImp implements IPersistencia {
	
   private PersistenciaImp(){};
	
	private static PersistenciaImp instancia = new PersistenciaImp();
	
	public static PersistenciaImp getInstance(){
		return instancia;
	} 

	public Venta AltaVenta(Venta venta) throws SQLException {
		
        String sql_idVenta = "SELECT valor FROM Configuracion WHERE Parametro='Id_Ventas' LIMIT 1";
		Integer id_idVenta =  1;
		PreparedStatement ps = null;
		PreparedStatement ps1 = null;
		Connection con = null;
		Statement stmt = null;
		ResultSet rs_idVenta = null;
		con = DBConn.DataSourceCon();
	//	con.setAutoCommit(false);
		
		try {
			stmt = con.createStatement();
			rs_idVenta =stmt.executeQuery(sql_idVenta);
			
			while(rs_idVenta.next()) {
				id_idVenta = Integer.valueOf(rs_idVenta.getString("valor")); //.valueOf(rs_idTerminal.getString("valor"));
			}
			
			id_idVenta +=1;
			String sql_addventa = "INSERT INTO Ventas (Id_Ticket, Matricula, FechaVenta,FechaInicio,Minutos,Importe,Id_Agencia) VALUES(?, ?,?,?,?,?,?)";
			String sql_increidventa = "UPDATE Configuracion SET valor =" + id_idVenta.toString() + " WHERE Parametro='"+Constants.getIdVentas()+"'";
			
			ps = con.prepareStatement(sql_addventa);
			ps1 = con.prepareStatement(sql_increidventa);
			
			venta.setId(id_idVenta);
			
			ps.setInt(1, id_idVenta);         
			ps.setString(2, venta.getMatricula());
		   java.sql.Timestamp fechainicio = new Timestamp(venta.getFechaInicio().getTime());
			java.sql.Timestamp fechaventa = new Timestamp(venta.getFechaVenta().getTime());
			
			
			ps.setTimestamp(3,fechaventa);
			ps.setTimestamp(4,fechainicio);
	        ps.setInt(5, venta.getMinutos());
			ps.setDouble(6, venta.getImporte());
			ps.setInt(7,venta.getIdAgencia());
			ps1.executeUpdate();
			ps.executeUpdate();
			
			return venta;
			
		} catch (Exception e) {
			e.printStackTrace();
					
		}finally {
			if(rs_idVenta != null) rs_idVenta.close();
			if(stmt != null) stmt.close();
		//	con.setAutoCommit(true);
			if(con != null) con.close();			
		}
		return null;
		
		
	}

	public Anulado AnularVentaBD(Venta venta) {
		Anulado anulado = new Anulado();
		
		String sql_idAnulado = "SELECT Valor FROM Configuracion WHERE parametro = ? LIMIT 1";
		String sql_updidAnulado = "UPDATE Configuracion SET Valor = ? WHERE parametro=?";
		String sql_addAnulado="INSERT INTO Anulaciones (Id_Ticket, Id_Anulado, Fecha) VALUES (?, ?, ?)";
		Integer idAnulado = 0;
		Date fechaactual = new Date();
		Timestamp fechaActual = new Timestamp(fechaactual.getTime());
		
		
		PreparedStatement ps_idAnulado = null;
		PreparedStatement ps_updidAnulado = null;
		PreparedStatement ps_addAnulado = null;
		
		Connection con = null;
		ResultSet rs_idAnulado = null;
		
		
		con = DBConn.DataSourceCon();
		//con.setAutoCommit(false);
		try {
			
			ps_idAnulado = con.prepareStatement(sql_idAnulado);
			ps_updidAnulado = con.prepareStatement(sql_updidAnulado);
			ps_addAnulado = con.prepareStatement(sql_addAnulado);

			ps_idAnulado.setString(1,Constants.getIdAnulaciones());
			
			rs_idAnulado = ps_idAnulado.executeQuery();
			
			while(rs_idAnulado.next()) {
				idAnulado  = rs_idAnulado.getInt("Valor");
			}
			//INCREMENTO Id_Anulado
			idAnulado +=1;
			
			ps_updidAnulado.setInt(1, idAnulado);
			ps_updidAnulado.setString(2, Constants.getIdAnulaciones());
			
			ps_addAnulado.setInt(1, venta.getId());
			ps_addAnulado.setInt(2, idAnulado);
			ps_addAnulado.setTimestamp(3, fechaActual);
			
			ps_updidAnulado.executeUpdate();
			ps_addAnulado.executeUpdate();

			anulado.setFecha(fechaactual);
			anulado.setId(idAnulado);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			anulado.setId(0);
			e.printStackTrace();
		}finally{
			try {
				ps_addAnulado.close();
				ps_updidAnulado.close();
				ps_idAnulado.close();
				rs_idAnulado.close();
				
				if(con != null) con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				anulado.setId(0);
				e.printStackTrace();
			}
	
		}
		
		return anulado;
	}

	boolean existeusuario(String us){
		
		String sql_ExisteUsrTer = "SELECT COUNT(*) AS Cantidad  "; 
		sql_ExisteUsrTer += " FROM Usuarios";
		sql_ExisteUsrTer += " WHERE Usuarios.Usuario = ? ";
		
		PreparedStatement sql_statement = null;
		Connection con = null;
		ResultSet rs_eUser = null;
		Integer count = -1 ;
		con = DBConn.DataSourceCon();
		//con.setAutoCommit(false);
		
			try {
				sql_statement = con.prepareStatement(sql_ExisteUsrTer);
				sql_statement.setString(1, us);            
				
				
				rs_eUser = sql_statement.executeQuery();
				rs_eUser.beforeFirst();
				rs_eUser.next();
				count = rs_eUser.getInt(1);
				
				sql_statement.close();
			    rs_eUser.close();
				con.close();
				
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			if(count!=0 ) {
				
				return true;
			}else{
				
				return false;
			}
	}
boolean existeAgencia(String us){
		
		String sql_ExisteUsrTer = "SELECT COUNT(*) AS Cantidad  "; 
		sql_ExisteUsrTer += " FROM Agencias";
		sql_ExisteUsrTer += " WHERE Agencias.Nombre = ? ";
		
		PreparedStatement sql_statement = null;
		Connection con = null;
		ResultSet rs_eUser = null;
		Integer count = -1 ;
		con = DBConn.DataSourceCon();
		//con.setAutoCommit(false);
		
			try {
				sql_statement = con.prepareStatement(sql_ExisteUsrTer);
				sql_statement.setString(1, us);            
				
				
				rs_eUser = sql_statement.executeQuery();
				rs_eUser.beforeFirst();
				rs_eUser.next();
				count = rs_eUser.getInt(1);
				sql_statement.close();
			    rs_eUser.close();
				con.close();
				
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			if(count!=0 ) {
				
				return true;
			}else{
				
				return false;
			}
	}

	public boolean IngresarUsuarioBD(Usuario usuario) {
		
		if (!existeusuario(usuario.getUsuario())){
			String sql_idUsuario = "SELECT Valor FROM Configuracion WHERE Parametro='Id_Usuarios' LIMIT 1";
			
			Integer id_idUsuario =  1;
			PreparedStatement ps = null;
			PreparedStatement ps1 = null;
			Connection con = null;
			Statement stmt = null;
			ResultSet rs_idUsuario = null;
			con = DBConn.DataSourceCon();
		//	con.setAutoCommit(false);
			
			try {
				stmt = con.createStatement();
				rs_idUsuario =stmt.executeQuery(sql_idUsuario);
				
				while(rs_idUsuario.next()) {
					id_idUsuario = Integer.valueOf(rs_idUsuario.getString("valor")); //.valueOf(rs_idTerminal.getString("valor"));
				}
				
				id_idUsuario +=1;
				String sql_addUsuario = "INSERT INTO Usuarios (Id, Nombre, Usuario, Password) VALUES(?, ?, ?, MD5(?))";
				
				String sql_increidusuario = "UPDATE Configuracion SET Valor =" + id_idUsuario + " WHERE Parametro='"+Constants.getIdUsuarios()+"'";
					
				ps = con.prepareStatement(sql_addUsuario);
				ps1 = con.prepareStatement(sql_increidusuario);
				ps.setInt(1, id_idUsuario);         
				ps.setString(2, usuario.getNombre());
				ps.setString(3, usuario. getUsuario());
				ps.setString(4, usuario.getPass());
				
				
				
				ps1.executeUpdate();
				ps.executeUpdate();
				
				return true;
				
			} catch (Exception e) {
				e.printStackTrace();
						
			}finally {
				if(rs_idUsuario != null)
					try {
						rs_idUsuario.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				if(stmt != null)
					try {
						stmt.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
			//	con.setAutoCommit(true);
				if(con != null)
					try {
						con.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}			
			}
		}
			return false;
			
		
		
		
		
	}

	public boolean ModificarUsuarioBD(Usuario usuario) {
	
		return true;
	}

	public int IngresarAgenciaBD(Agencia agencia){ //sdc 13/11/12
		if (!existeAgencia(agencia.getNombre())){
		String sql_idAgencia = "SELECT Valor FROM Configuracion WHERE Parametro='Id_Agencias' LIMIT 1";
		
		int id_idAgencia =  1;
		PreparedStatement ps = null;
		PreparedStatement ps1 = null;
		Connection con = null;
		Statement stmt = null;
		ResultSet rs_idAgencia = null;
		
		con = DBConn.DataSourceCon();
		try {
		//	con.setAutoCommit(false);
	
			stmt = con.createStatement();
			rs_idAgencia =stmt.executeQuery(sql_idAgencia);
			while(rs_idAgencia.next()) {
				id_idAgencia = Integer.valueOf(rs_idAgencia.getString("valor")); 
			}
			id_idAgencia +=1;
			String sql_addagencia = "INSERT INTO Agencias (id, nombre, domicilio, telefono) VALUES(?, ?, ?, ?)";
			String sql_increidagencia  = "UPDATE Configuracion SET Valor =" + id_idAgencia + " WHERE Parametro='"+Constants.getIdAgencias()+"'";
			
			ps = con.prepareStatement(sql_addagencia);
			ps1 = con.prepareStatement(sql_increidagencia);
			
			ps.setDouble(1, id_idAgencia);         
			ps.setString(2, agencia.getNombre());
			ps.setString(3, agencia.getDomicilio());
			ps.setString(4, agencia.getTelefono());
			ps1.executeUpdate();
			ps.executeUpdate();
		
			//con.commit();
			return id_idAgencia;
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
			return -1;
					
		}finally {
			if(rs_idAgencia != null)
				try {
					rs_idAgencia.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			if(stmt != null)
				try {
					stmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		//	con.setAutoCommit(true);
			if(con != null)
				try {
					con.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			
		}
		}
		return -1;
		
	}

	public boolean ModificarAgenciaBD(Agencia agencia) {
		return true;
	}

	public double ObtenerMontoBD(int minutos) {
		return 0;
	}

	public boolean ExisteUsuarioBD(String us, String pass) throws SQLException { 
		
		
		
		String sql_ExisteUsrTer = "SELECT COUNT(*) AS Cantidad  "; 
		sql_ExisteUsrTer += " FROM Usuarios";
		sql_ExisteUsrTer += " WHERE Usuarios.Usuario = ? AND Usuarios.Password = MD5(?) ";
		
		PreparedStatement sql_statement = null;
		Connection con = null;
		ResultSet rs_eUser = null;
		Integer count ;
		con = DBConn.DataSourceCon();
		con.setAutoCommit(false);
		
			sql_statement = con.prepareStatement(sql_ExisteUsrTer);
			sql_statement.setString(1, us);            
			sql_statement.setString(2, pass);
		
			rs_eUser = sql_statement.executeQuery();
			rs_eUser.beforeFirst();
			rs_eUser.next();
			count = rs_eUser.getInt(1);
		    rs_eUser.close();
			con.close();
			if(count!=0 ) {
				
				return true;
			}else{
				
				return false;
			}
		
	}

	public boolean BuscarAgenciaBD(Agencia agencia) {
		return true;
	}

	public Venta buscarVenta(Integer id_Ticket_IMM) throws SQLException {
		Venta venta = new Venta();
		
		String sql_Venta = "SELECT Ventas.Id_Ticket, " +
				"Ventas.Matricula, " +
				"Ventas.FechaVenta, " +
				"Ventas.FechaInicio, " +
				"Ventas.Minutos, " +
				"Ventas.Importe, " +
				"Ventas.Id_Agencia " +
				"FROM Ventas " +
				"WHERE Ventas.Id_Ticket = ?";
		
		PreparedStatement sql_statement = null;
		Connection con = null;
		ResultSet rs_eVenta = null;
		
		con = DBConn.DataSourceCon();

		sql_statement = con.prepareStatement(sql_Venta);
		sql_statement.setInt(1, id_Ticket_IMM); 
		
		rs_eVenta = sql_statement.executeQuery();
		while(rs_eVenta.next()){
			venta.setId(rs_eVenta.getInt("Id_Ticket"));
			venta.setMatricula(rs_eVenta.getString("Matricula"));
			venta.setFechaVenta(rs_eVenta.getTimestamp("FechaVenta"));
			venta.setFechaInicio(rs_eVenta.getTimestamp("FechaInicio"));
			venta.setMinutos(rs_eVenta.getInt("Minutos"));
			venta.setImporte(rs_eVenta.getDouble("Importe"));
			venta.setIdAgencia(rs_eVenta.getInt("Id_Agencia"));;
		}
		sql_statement.close();
		rs_eVenta.close();
		con.close();
		
		return venta;
	}

	public boolean verificarVentaAnulada(Venta venta) throws SQLException {
		// TODO Auto-generated method stub
		String sql_ExisteVenta = "SELECT COUNT(Ventas.Id_Ticket) AS Cantidad " +
				"FROM Anulaciones " +
				"JOIN Ventas ON  Ventas.Id_Ticket=Anulaciones.Id_Ticket " +
				"WHERE Ventas.Id_Ticket = ? "; 
		
		PreparedStatement sql_statement = null;
		Connection con = null;
		ResultSet rs_eUser = null;
		Integer count = 0;
		
		con = DBConn.DataSourceCon();

		sql_statement = con.prepareStatement(sql_ExisteVenta);
		sql_statement.setInt(1, venta.getId());
		
		rs_eUser = sql_statement.executeQuery();
		rs_eUser.next();
		
		count = rs_eUser.getInt("Cantidad");
		sql_statement.close();
		rs_eUser.close();
		con.close();
		
		if(count!=0){
			return true;
		}else{
			return false;
		}
	}

	public boolean verificarDatosVentas(Venta venta) throws SQLException {
		
		String sql_ExisteVenta = "SELECT COUNT(Id_Ticket) AS Cantidad " +
				"FROM Ventas " +
				"WHERE Id_Ticket = ? " +
				"AND Matricula = ?";
		
		PreparedStatement sql_statement = null;
		Connection con = null;
		ResultSet rs_eUser = null;
		Integer count = 0;
		
		con = DBConn.DataSourceCon();

		sql_statement = con.prepareStatement(sql_ExisteVenta);
		sql_statement.setInt(1, venta.getId());
		sql_statement.setString(2, venta.getMatricula());
		
		rs_eUser = sql_statement.executeQuery();
		rs_eUser.next();
		
		count = rs_eUser.getInt("Cantidad");
		
		sql_statement.close();
		rs_eUser.close();
		con.close();
		
		if(count!=0){
			return true;
		}else{
			return false;
		}
	}
	public Integer obtenerMinutoQuiebre()  throws SQLException{
		String sql_minutoQuiebre = "SELECT Valor FROM Configuracion WHERE Parametro=? LIMIT 1";
		Integer minutoQuiebre = 15;
		
		PreparedStatement ps_minutoQuiebre = null;
		
		Connection con = null;
		ResultSet rs_minutoQuiebre = null;
			
		con = DBConn.DataSourceCon();
		//con.setAutoCommit(false);
		try {
			
			ps_minutoQuiebre = con.prepareStatement(sql_minutoQuiebre);

			ps_minutoQuiebre.setString(1,Constants.getPeriodoEstacionamiento());
			
			rs_minutoQuiebre = ps_minutoQuiebre.executeQuery();
			
			while(rs_minutoQuiebre.next()) {
				minutoQuiebre  = rs_minutoQuiebre.getInt("Valor");
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				ps_minutoQuiebre.close();
				rs_minutoQuiebre.close();
				if(con != null) con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return minutoQuiebre;
	}

	public Double montoMinuto() throws SQLException {
		String sql_montoMinuto = "SELECT Valor FROM Configuracion WHERE Parametro=? LIMIT 1";
		Double montoMinuto = 1.0;
		
		PreparedStatement ps_montoMinuto = null;
		
		Connection con = null;
		ResultSet rs_montoMinuto = null;
			
		con = DBConn.DataSourceCon();
		//con.setAutoCommit(false);
		try {
			
			ps_montoMinuto = con.prepareStatement(sql_montoMinuto);

			ps_montoMinuto.setString(1,Constants.getCostoPeriodoEstacionamiento());
			
			rs_montoMinuto = ps_montoMinuto.executeQuery();
			
			while(rs_montoMinuto.next()) {
				montoMinuto  = rs_montoMinuto.getDouble("Valor");
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			try {
				ps_montoMinuto.close();
				rs_montoMinuto.close();
				if(con != null) con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return montoMinuto;
	}
}
